#ifndef __64USINGTEMPLATEASPARAMETERCPP_H__
#define __64USINGTEMPLATEASPARAMETERCPP_H__

#include "60StackForNonePointer.hpp"

// 先看一段代码
// 其中 "<template <typename T> class Thing>" 是参数类型,相当于T,只是需要满足 Thing类而且模板类型为T的参数, 这里的typename可以使用class代替
template <template <typename T> class Thing>
// 为了使传递的参数正确,这里创建一个适用于传递的类
// template <typename T>
// class King {
//     //........
// };
// 这里King即可作为参数,传递给Crab类的模板类型参数
// 代码中演示的用的Stack, 因为Stack类满足 template <template <typename T> class Stack.
class Crab
{
private:
    // 这里的Thing即为传入的模本参数, 具体类型为 template <typename T> class, 是一个模本类
    Thing<int> s1;
    Thing<double> s2;

public:
    Crab(){};
    bool push(int a, double x) { return s1.push(a) && s2.push(x); }
    bool pop(int &a, double &x) { return s1.pop(a), &&s2.pop(x) }
};

// 当然可以混合使用模板参数和常规参数 类似下面这样的
template <template <typename T> class Things, typename U, typename V>
class Examples1
{
public:
    Things<U> things1;
    Things<V> things2;
};



#endif // __64USINGTEMPLATEASPARAMETERCPP_H__